home *** CD-ROM | disk | FTP | other *** search
/ ftp.hitl.washington.edu / ftp.hitl.washington.edu.tar / ftp.hitl.washington.edu / pub / people / tsoper / CT Explorer / ScrollSlider.cs < prev    next >
Text File  |  2005-05-31  |  12KB  |  420 lines

  1. //ScrollSlider.cs
  2.  
  3. using System;
  4. using System.Collections;
  5. using System.ComponentModel;
  6. using System.Drawing;
  7. using System.Data;
  8. using System.Windows.Forms;
  9.  
  10. namespace MyCustomControls
  11. {
  12.     public class ScrollSlider : System.Windows.Forms.UserControl
  13.     {
  14.         //Controls
  15.         private System.Windows.Forms.Panel panel_Container;
  16.         private System.Windows.Forms.Panel panel_Left;
  17.         private System.Windows.Forms.Splitter splitter_Left;
  18.         private System.Windows.Forms.Splitter splitter_Right;
  19.         private System.Windows.Forms.Panel panel_Center;
  20.         private System.Windows.Forms.Panel panel_Right;
  21.  
  22.         //Properties
  23.         private float window;
  24.         public float Window
  25.         {
  26.             get 
  27.             {
  28.                 return window;
  29.             }
  30.             set
  31.             {
  32.                 window = value;
  33.                 UpdateControlAfterStretch();
  34.             }
  35.         }
  36.         private float level;
  37.         public float Level
  38.         {
  39.             get
  40.             {
  41.                 return level;
  42.             }
  43.             set
  44.             {
  45.                 level = value;
  46.                 UpdateControlAfterScroll();
  47.             }
  48.         }
  49.  
  50.  
  51.         //Events
  52.         public event EventHandler Scroll;
  53.         public event EventHandler Stretch;
  54.         public event MouseEventHandler MouseDown;
  55.         public event MouseEventHandler MouseUp;
  56.  
  57.         //Mouse Input
  58.         bool mouseDown_cp = false; //mouse down on center panel
  59.         bool mouseDown_sr = false; //mouse down on right splitter
  60.         bool mouseDown_sl = false; //mouse down on left splitter
  61.         Point mousePos;
  62.  
  63.         //Control Colors
  64.         public Color SliderColor;
  65.         public Color SliderActiveColor;
  66.         public Color BackColor;
  67.         public Color SliderEndColor;
  68.         /// <summary> 
  69.         /// Required designer variable.
  70.         /// </summary>
  71.         private System.ComponentModel.Container components = null;
  72.  
  73.         public ScrollSlider()
  74.         {
  75.             // This call is required by the Windows.Forms Form Designer.
  76.             InitializeComponent();
  77.  
  78.             // TODO: Add any initialization after the InitializeComponent call
  79.         
  80.             //initialize window and level
  81.             //this.Window = 0.3f;
  82.             //this.Level = 0.5f;
  83.  
  84.             //set docking attributes of panels and splitters
  85.             this.panel_Container.Dock = DockStyle.Fill;
  86.             this.splitter_Right.Dock = DockStyle.Right;
  87.             this.panel_Right.Dock = DockStyle.Right;
  88.             this.panel_Left.Dock = DockStyle.Left;
  89.             this.splitter_Left.Dock = DockStyle.Left;
  90.  
  91.  
  92.             //need to see left side splitter
  93.             splitter_Left.BringToFront();
  94.  
  95.             //get rid of the margins
  96.             //i.e. let splitters touch container sides
  97.             //and keep the the splitters zero distance away
  98.             this.splitter_Left.MinSize = 0;
  99.             this.splitter_Right.MinSize = 0;
  100.             this.splitter_Left.MinExtra = 0;
  101.             this.splitter_Right.MinExtra = 0;
  102.         
  103.             //set up the callbacks for user based events
  104.             splitter_Left.MouseMove += new MouseEventHandler(
  105.                 splitter_MouseMove);
  106.             splitter_Left.MouseDown += new MouseEventHandler(
  107.                 splitter_MouseDown);
  108.             splitter_Left.MouseUp += new MouseEventHandler(
  109.                 splitter_MouseUp);
  110.             splitter_Right.MouseMove += new MouseEventHandler(
  111.                 splitter_MouseMove);
  112.             splitter_Right.MouseDown += new MouseEventHandler(
  113.                 splitter_MouseDown);
  114.             splitter_Right.MouseUp += new MouseEventHandler(
  115.                 splitter_MouseUp);
  116.             panel_Center.MouseDown += new MouseEventHandler(
  117.                 panel_Center_MouseDown);
  118.             panel_Center.MouseUp += new MouseEventHandler(
  119.                 panel_Center_MouseUp);
  120.             panel_Center.MouseMove += new MouseEventHandler(
  121.                 panel_Center_MouseMove);
  122.             this.Resize += new EventHandler(panel_Container_Resize);
  123.  
  124.             //set the control colors
  125.             this.SliderColor = Color.Transparent;
  126.             this.SliderActiveColor = Color.White;
  127.             this.BackColor = Color.Gray;
  128.             this.SliderEndColor = Color.Transparent;
  129.  
  130.             this.panel_Center.BackColor = SliderColor;
  131.             this.panel_Left.BackColor = BackColor;
  132.             this.panel_Right.BackColor = BackColor;
  133.             splitter_Right.BorderStyle = BorderStyle.Fixed3D;
  134.             splitter_Right.BorderStyle = BorderStyle.Fixed3D;
  135.             panel_Container.BorderStyle = BorderStyle.Fixed3D;
  136.         }
  137.  
  138.         private void UpdateControlAfterScroll()
  139.         {
  140.             int cx = this.Width; 
  141.             int cy = this.Height;
  142.  
  143.             int windowInPixels = (int)(window*cx);
  144.             int levelInPixels = (int)(level*cx);
  145.             int leftMarginInPixels = levelInPixels - windowInPixels/2;
  146.             int rightMarginInPixels = cx - windowInPixels - leftMarginInPixels;
  147.         
  148.             //change location of panel_Center
  149.             panel_Center.Location = new Point(leftMarginInPixels, 0);
  150.         
  151.             //change size of panel_Left
  152.             panel_Left.Size = new Size(leftMarginInPixels,
  153.                 panel_Left.Height);
  154.  
  155.             //change bounds of panel_Right (add - 4=splitter.Width?)
  156.             panel_Right.SetBounds(cx-rightMarginInPixels-4,0,
  157.                 rightMarginInPixels,panel_Right.Height);
  158.  
  159.         }
  160.  
  161.         private void UpdateControlAfterStretch()
  162.         {
  163.             int cx = this.Width; 
  164.             int cy = this.Height;
  165.  
  166.             int windowInPixels = (int)(window*cx);
  167.             int levelInPixels = (int)(level*cx);
  168.             int leftMarginInPixels = levelInPixels - windowInPixels/2;
  169.             int rightMarginInPixels = cx - windowInPixels - leftMarginInPixels;
  170.         
  171.             //change size of panel_Left
  172.             panel_Left.Size = new Size(leftMarginInPixels,
  173.                 panel_Left.Height);
  174.  
  175.             //change location and size of panel_Center
  176.             panel_Center.SetBounds(leftMarginInPixels,0,
  177.                 windowInPixels,panel_Center.Height);
  178.  
  179.             //change bounds of panel_Right
  180.             panel_Right.SetBounds(cx-rightMarginInPixels-4,0,
  181.                 rightMarginInPixels, panel_Right.Height);
  182.         }
  183.  
  184.  
  185.         /// <summary> 
  186.         /// Clean up any resources being used.
  187.         /// </summary>
  188.         protected override void Dispose( bool disposing )
  189.         {
  190.             if( disposing )
  191.             {
  192.                 if(components != null)
  193.                 {
  194.                     components.Dispose();
  195.                 }
  196.             }
  197.             base.Dispose( disposing );
  198.         }
  199.  
  200.         #region Component Designer generated code
  201.         /// <summary> 
  202.         /// Required method for Designer support - do not modify 
  203.         /// the contents of this method with the code editor.
  204.         /// </summary>
  205.         private void InitializeComponent()
  206.         {
  207.             this.panel_Container = new System.Windows.Forms.Panel();
  208.             this.splitter_Right = new System.Windows.Forms.Splitter();
  209.             this.panel_Right = new System.Windows.Forms.Panel();
  210.             this.panel_Center = new System.Windows.Forms.Panel();
  211.             this.splitter_Left = new System.Windows.Forms.Splitter();
  212.             this.panel_Left = new System.Windows.Forms.Panel();
  213.             this.panel_Container.SuspendLayout();
  214.             this.SuspendLayout();
  215.             // 
  216.             // panel_Container
  217.             // 
  218.             this.panel_Container.Controls.Add(this.splitter_Right);
  219.             this.panel_Container.Controls.Add(this.panel_Right);
  220.             this.panel_Container.Controls.Add(this.panel_Center);
  221.             this.panel_Container.Controls.Add(this.splitter_Left);
  222.             this.panel_Container.Controls.Add(this.panel_Left);
  223.             this.panel_Container.Location = new System.Drawing.Point(0, 0);
  224.             this.panel_Container.Name = "panel_Container";
  225.             this.panel_Container.Size = new System.Drawing.Size(150, 15);
  226.             this.panel_Container.TabIndex = 0;
  227.             this.panel_Container.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
  228.             // 
  229.             // splitter_Right
  230.             // 
  231.             this.splitter_Right.Location = new System.Drawing.Point(3, 0);
  232.             this.splitter_Right.Name = "splitter_Right";
  233.             this.splitter_Right.Size = new System.Drawing.Size(3, 96);
  234.             this.splitter_Right.TabIndex = 2;
  235.             this.splitter_Right.TabStop = false;
  236.             // 
  237.             // panel_Right
  238.             // 
  239.             this.panel_Right.Location = new System.Drawing.Point(168, 0);
  240.             this.panel_Right.Name = "panel_Right";
  241.             this.panel_Right.Size = new System.Drawing.Size(48, 96);
  242.             this.panel_Right.TabIndex = 4;
  243.             // 
  244.             // panel_Center
  245.             // 
  246.             this.panel_Center.Location = new System.Drawing.Point(96, 0);
  247.             this.panel_Center.Name = "panel_Center";
  248.             this.panel_Center.Size = new System.Drawing.Size(48, 96);
  249.             this.panel_Center.TabIndex = 3;
  250.             // 
  251.             // splitter_Left
  252.             // 
  253.             this.splitter_Left.Location = new System.Drawing.Point(0, 0);
  254.             this.splitter_Left.Name = "splitter_Left";
  255.             this.splitter_Left.Size = new System.Drawing.Size(3, 96);
  256.             this.splitter_Left.TabIndex = 1;
  257.             this.splitter_Left.TabStop = false;
  258.             // 
  259.             // panel_Left
  260.             // 
  261.             this.panel_Left.Location = new System.Drawing.Point(24, 0);
  262.             this.panel_Left.Name = "panel_Left";
  263.             this.panel_Left.Size = new System.Drawing.Size(48, 96);
  264.             this.panel_Left.TabIndex = 0;
  265.             // 
  266.             // ScrollSlider
  267.             // 
  268.             this.Controls.Add(this.panel_Container);
  269.             this.Name = "ScrollSlider";
  270.             this.Size = new System.Drawing.Size(160, 24);
  271.             this.Load += new System.EventHandler(this.ScrollSlider_Load);
  272.             this.panel_Container.ResumeLayout(false);
  273.             this.ResumeLayout(false);
  274.  
  275.         }
  276.         #endregion
  277.  
  278.         private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  279.         {
  280.     
  281.         }
  282.  
  283.         private void splitter1_SplitterMoved(object sender, System.Windows.Forms.SplitterEventArgs e)
  284.         {
  285.  
  286.         }
  287.  
  288.         private void ScrollSlider_Load(object sender, System.EventArgs e)
  289.         {
  290.     
  291.         }
  292.  
  293.         //-------CALLBACKS--------------------------------------------
  294.         private void splitter_MouseDown(object sender, MouseEventArgs e)
  295.         {
  296.             if(sender.Equals(splitter_Left))
  297.                 mouseDown_sl = true; //left splitter
  298.             else
  299.                 mouseDown_sr = true; //right splitter
  300.  
  301.             mousePos.X = e.X;
  302.             mousePos.Y = e.Y;
  303.  
  304.             if(MouseDown!=null)
  305.                 MouseDown(this,e);
  306.         }
  307.  
  308.         private void splitter_MouseUp(object sender, MouseEventArgs e)
  309.         {
  310.             if(sender.Equals(splitter_Left))
  311.                 mouseDown_sl = false; //left splitter
  312.             else
  313.                 mouseDown_sr = false; //right splitter
  314.  
  315.             if(MouseUp!=null)
  316.                 MouseUp(this,e);
  317.         }
  318.  
  319.         private void splitter_MouseMove(object sender, MouseEventArgs e)
  320.         {
  321.             if(mouseDown_sl || mouseDown_sr)
  322.             {
  323.                 //get the change in position
  324.                 int dxLeft, dxRight;
  325.                 if(mouseDown_sl)
  326.                 {
  327.                     dxLeft = e.X - mousePos.X;
  328.                     dxRight = - dxLeft;
  329.                 }
  330.                 else
  331.                 {
  332.                     dxRight = e.X - mousePos.X;
  333.                     dxLeft = - dxRight;
  334.                 }
  335.  
  336.                 //determine the margins
  337.                 int marginLeft = panel_Left.Size.Width;
  338.                 int marginRight = panel_Right.Size.Width;
  339.                 int marginBetween = splitter_Right.Left - 
  340.                     splitter_Left.Right;
  341.  
  342.                 //prevent out-of-range values
  343.                 if((dxLeft < 0) && ((-dxLeft) > marginLeft))
  344.                     dxLeft = -marginLeft; //keep slider above lower limit
  345.  
  346.                 if((dxRight > 0) && ((dxRight) > marginRight))
  347.                     dxRight = marginRight; //keep slider below upper limit
  348.  
  349.                 if((dxLeft > 0) && ((dxLeft*2) > (marginBetween - 5)))
  350.                     dxLeft = (marginBetween-5)/2; //keep sliders on 
  351.                 dxRight = -dxLeft;            //proper sides
  352.             
  353.  
  354.                 //update controls
  355.                 window += (dxRight - dxLeft)/(float)this.Width;
  356.                 UpdateControlAfterStretch();
  357.             
  358.                 //fire stretch event
  359.                 if(Stretch != null)
  360.                     Stretch(this, e);
  361.             }
  362.  
  363.         }
  364.  
  365.         private void panel_Center_MouseDown(object sender, MouseEventArgs e)
  366.         {
  367.             panel_Center.BackColor = SliderActiveColor;
  368.             mouseDown_cp = true;
  369.             mousePos.X = e.X;
  370.             mousePos.Y = e.Y;
  371.  
  372.             if(MouseDown!=null)
  373.                 MouseDown(this,e);
  374.         }
  375.         private void panel_Center_MouseUp(object sender, MouseEventArgs e)
  376.         {
  377.             mouseDown_cp = false;
  378.             panel_Center.BackColor = Color.Transparent;
  379.             panel_Center.BackColor = SliderColor;
  380.  
  381.             if(MouseUp!=null)
  382.                 MouseUp(this,e);
  383.         }
  384.         private void panel_Center_MouseMove(object sender, MouseEventArgs e)
  385.         {
  386.             //slider is active... move it with the mouse
  387.             if(mouseDown_cp)
  388.             {
  389.                 //determine how big the move is, and compare to margins
  390.                 int dx = e.X - mousePos.X;
  391.                 int marginLeft = panel_Left.Size.Width;
  392.                 int marginRight = panel_Right.Size.Width;
  393.  
  394.                 if((dx < 0) && ((-dx) > marginLeft))
  395.                     dx = -marginLeft; //keep slider above lower limit
  396.  
  397.                 if((dx > 0) && ((dx) > marginRight))
  398.                     dx = marginRight; //keep slider below upper limit
  399.             
  400.                 //update controls after scroll
  401.                 level += dx/(float)this.Width;
  402.                 UpdateControlAfterScroll();
  403.             
  404.                 //fire scroll event
  405.                 if(Scroll != null)
  406.                     Scroll(this, e);
  407.             }
  408.         }
  409.  
  410.         private void panel_Container_Resize(object sender, EventArgs e)
  411.         {
  412.             this.panel_Center.Left = splitter_Left.Left;
  413.             this.panel_Center.Size = new Size(splitter_Right.Left -
  414.                 splitter_Left.Right,this.Height);
  415.             UpdateControlAfterScroll();
  416.             UpdateControlAfterStretch();
  417.         }
  418.     }
  419. }
  420.